Spatial Video는 아이폰 15프로, 15프로맥스에서 지원하는 3차원 동영상 비디오 입니다. 아이폰 15프로 또는 맥스를 가지고 있다면 Spatial Video를 만들 수 있습니다. 하지만 현재 이렇게 녹화된 동영상은 애플 비젼프로, 오큘러스에서만 플레이 할수 있습니다.
Spatial Video의 기본 원리는 양쪽눈의 시각차이를 이용한 방법 이므로 이미 사용중인 3D 안경을 이용하는 방법으로 일반 동영상 플레이어에서도 3D 동영상을 볼 수 있습니다.
Swift를 이용한 동영상 분리
아래 링크의 프로젝트에서 Swift를 이용하여 Spatial Video를 분리하여 좌측, 우측 동영상을 분리하여 UIImage로 변환하는 기능을 볼수 있습니다.
10년 넘게 앱 스토어에서 앱을 팔고(?) 있지만 최근엔 잘 안팔립니다. 시장도 포화되었고, 유저들 사용성도 고착화 되어 새로운 앱을 깔지 않죠. 게다가 유료라면 더욱 거들떠 보지도 않습니다.
그래도 스토어에 앱을 만들어 올리는 일은 개발자로서 긴장을 늦추지 않는 개인적인 방법입니다. 그러면서 평소같으면 하지 않을 프레임워크 공부도 하고 스토어 정책변화도 살피고 합니다. 그게 돈 버는 일 할때 도움이 되거든요. 재사용할 수 있는 코드도 미리 좀 만들어 놓고, 스토어 업로드 할때 당황(?)하지 않고.. ^^
올해 iOS의 AVFoundation을 많이 쓰게 되면서 공부삼아 만들어본 블랙박스 형식의 녹화 전용앱을 스토어에 업로드 했습니다. 단위 녹화시간, 해상도, fps를 조정할 수 있고, 애플워치로 녹화/중지도 되고, 앨범에 저장하지 않고 자체적으로 저장하거나 iCloud 에 저장할 수 있습니다만 유료입니다. 2.99달러. 물론 안사셔도 됩니다. 그냥 광고입니다 ^^;
자전거에 달고 액션캠으로 써보려고 만든건데 테스트 하다보니 아이폰 15프로를 사고 싶다는 생각이 간절하더군요.
크랙디텍터(Crack Detector) V3가 앱스토어에 릴리즈되었습니다. 크랙디텍터는 스마트폰 카메라에서 촬영한 콘크리트 벽면의 벌어진틈(크랙)을 찾아내고 크랙의 두께와 길이를 이미지 프로세싱 방법으로 측정하는 소프트웨어 서비스 입니다.
V3 – 머신러닝
크랙디텍터를 만들기 시작한건 거의 10년이 넘었습니다만 상용화 가능한 수준의 제품이 된건 이번 버전이 처음입니다.
V3에서 가장 큰 변화는 사진에서 크랙을 찾아내는 방법을 기존의 룰베이스 이미지 프로세싱에서 세그멘테이션 머신러닝을 도입한 것입니다. 기존의 이미지 프로세싱 방법은 현장의 위치, 조명, 시간등에 따른 이미지 품질 차이로 인해서 크랙을 못찾거나 그림자를 크랙으로 인식하는 등의 문제가 있었습니다만 머신러닝 도입후 크랙디텍션 성능이 매우 향상되었습니다.
마커
앱을 다운 받고 콘크리트 벽에 크랙을 촬영하면 이미지를 분석해서 크랙을 찾아냅니다만 크랙의 크기를 Pixel 단위로 표시합니다. 마커를 활용하면 Pixel 단위를 mm 단위로 정확하게 변환 할 수 있습니다.
마커는 정밀측정이 가능한 4개의 마커를 가진 하드웨어 타입과 1개의 마커를 사용하는 스티커 타입을 쓸 수 있습니다.
WebRTC는 offer – answer – candidate 등의 데이터를 주고받는 과정을 거쳐야만 화상통신을 연결 할 수 있는데 이 과정을 시그널링이라고 하고 일반적으로 시그널 서버를 만들어서 카메라와 뷰어를 연결합니다. 규정된 방법은 없고 개발자가 원하는 방법으로 데이터를 전달 하기만 하면 됩니다. 주로 소켓을 많이 이용합니다.
이것을 위해 별도의 서버를 운영을 해야 합니다. 언젠가 이런 생각을 해 봤습니다. 로그인 하지 않고 서버 없이 연결 할 수 없을까? 원격은 좀 어렵겠지만 로컬 Wifi에서는 가능하지 않을까? 로컬 Wifi 에 연결된 모든 앱이 소켓을 열고 서로 데이터를 주고 받으면 WebRTC 서버 없이 연결할 수 있겠는데? … 그런데 일단 앱의 IP를 알아야만 되더군요.
Bonsoir는 Zeroconf(https://ko.wikipedia.org/wiki/Zeroconf) 기반의 Discover 패키지입니다. 아래의 코드처럼 이벤트를 리스닝하고 있으면 브로드개스트를 하는 모든 기기를 찾을 수 있습니다. 애플은 봉주르라는 이름으로 기기들을 연결하고 있습니다.
Future<void> _discoverService() async {
_discovery = BonsoirDiscovery(type: _type);
if (_discovery != null) {
await _discovery!.ready;
_discovery!.eventStream!.listen((event) {
if (event.service != null) {
ResolvedBonsoirService service = event.service as ResolvedBonsoirService;
if (event.type == BonsoirDiscoveryEventType.discoveryServiceResolved) {
final index = _resolvedServices.indexWhere((ResolvedBonsoirService item) => item.ip == service.ip);
if (index == -1 && service.ip.toString() != "null") {
_resolvedServices.add(service);
setState(() {});
}
} else if (event.type == BonsoirDiscoveryEventType.discoveryServiceLost) {
_resolvedServices.remove(service);
setState(() {});
}
}
});
await _discovery!.start();
}
}
오픈소스 WebRTC 카메라
위의 몇가지 기술을 조립해서 앱을 만들어 봤습니다. 플러터의 장점인 멀티 플랫폼 지원 기능으로 아이폰 / 안드로이드 / 맥 에서 실행 가능 하도록 만들었습니다. 아래 링크에서 소스를 다운 받을 수 있습니다.
우선 맥앱을 빌드해서 맥에 실행하고 스마트폰에 앱을 빌드해서 실행하면 위의 그림과 같이 와이파이 무선 카메라를 실행 할 수 있습니다. 연결에 제한이 없으므로 많은 카메라를 한번에 연결 할 수도 있습니다.
코드를 수정하면 두대의 스마트폰으로 한대는 서버로 다른 스마트폰을 카메라로 사용할 수도 있습니다.
EdgeDB는 Postgres 위에 만든 Graph/Relational DB 라고 한다. R-DB 이기는 하지만 SQL을 사용하지 않고 EgdeQL라는 새로 정의된 쿼리언어(?)를 사용하는데 SQL을 안다면 그리 어렵지는 않다.
개인적으로 쿼리언어를 바꾸는건 사실상 거의 불가능(? – 너무 오래 써서) 하다고 생각하고 있지만 의외로 GraphQL을 사용할 수 있는데 관심이 생겼다. 서버 코드 적게 쓰거나 안써도 될까? 이건 늘 관심사다. 그래도 DB 바꾸는 일은 쉬운일이 절대 아니다. 특히 SQL은 더더욱. EdgeDB의 GraphQL 부분만 한번 테스트 해봤다. 다음 프로젝트에서 써먹을 수 있을까 싶어서…
설치
설치는 매우 쉽다. 커맨드 라인에 명령어를 입력하면 자동으로 설치된다. 링크를 따라가면 Windows용 설치 명령어도 있다.
설치가 완료되고 테스트용 스키마를 만들었다. 설치된 폴더 아래에 \dbschema 라는 폴더가 있고 거기에 default.esdl 파일이 생성되어 있다. 이 파일을 텍스트 편집기로 열고 아래 스키마를 입력하고 저장한다.
module default {
type Person {
required property first_name -> str;
required property last_name -> str;
}
type Movie {
required property title -> str;
property year -> int64;
link director -> Person;
multi link actors -> Person;
}
};
그리고 마이그레이션 과정을 거치면
마이그레이션 실행
> edgedb migration create
> edgedb migrate
스키마가 생성되고 입력, 수정, 삭제 등이 가능하다. 테스트를 위해 몇개의 데이터를 삽입했다.
테스트의 목적이 GraphQL을 통한 데이터 쿼리였으니 GraphQL 기능을 Enable 상태로 바꾸어야 한다. 방법은 위의 default.esd 파일의 첫줄에 아래 명령어를 추가 해주고 마이그레이션 명령을 한번 더 실행하는 것으로 완료된다.
using extension graphql;
실행하고 나서 edgedb instance list 커맨드를 실행하면 Name, Port, Status등을 확인 할 수 있다.
그리고 PostMan 같은 API Call 도구를 이용해서 http get을 통해서 아래와 같이 Json데이터를 얻을 수 있었다.
결론
GraphQL은 마치 과거에 C/S 프로그램을 연상 시키지만 SQL을 사용하지 않는다는 점에서 보안상의 헛점을 해결한듯 보인다. 그러면서도 REST 서버 코드를 줄이고 생산성을 높인다는 점에서 매력적으로 보인다. EdgeDB는 SQL을 버리면서 또다른 방법을 보여준것 같아서 기대가 된다.
최근 Velodyne 라이다 VLP-16을 사용해 볼 기회가 생겼다. 이 라이다는 자율주행 자동차에 많이 사용되고 있지만 나는 라이다를 고정하고 특정 목표물의 시간에 따른 위치변화(변이)를 확인하고자 테스트를 시작했고 결과물로 파이썬에서 라이다 데이터를 실시간으로 읽어서 파일 혹은 데이터 베이스에 저장할 목적으로 테스트를 했다.
ROS
라이다를 구입할 때 받은 VeloView라는 프로그램으로 라이다가 정상적으로 작동하고 PCAP 또는 CSV 형태의 파일로 저장 가능한 것을 확인했지만 그건 내가 원하는 방법이 아니었다.
며칠의 삽질끝에 ROS를 이용하는 것이 가장(?) 효율적이라는 결론을 얻고 Ubuntu 20.04에 ROS – Noetic을 설치했다. 아래의 링크에서 ROS 설치 방법을 확인할 수 있다.
ROS를 이용하는 가장 큰 이유는 이미 만들어진 드라이버를 활용할 수 있기 때문인데 Velodyne Lidar 역시 버전별로 드라이버가 있다. 아래의 링크와 같이 드라이버를 설치했다. 링크에는 최초에 라이다를 연결하는 방법부터 rviz를 이용하여 VeloView와 같은 형식으로 라이다 데이터를 조회 할 수 있는 방법까지 알려준다.
Seoul–(Newswire) May 03, 2022 — Mobile app developer Practical (CEO Park Byeong-il) has developed its own ‘Banzle video player for pets’ on Google Play Store (Android) and App Store. It was announced on the 3rd that it was officially opened through (IOS).
‘Banzle’, a video player for companion animals developed by Practical, is a video player that allows companion animals to spend the day happily by playing the video on a smartphone that is not in use to the companion animal alone at home after the companion has gone to work. Smartphone-only apps and services.
As of 2022, there are 15 million domestic companions, and the reality is that one in four companion animals spends more than six hours a day alone. Companion owners turn on the lights or install air-conditioning, air-conditioning, automatic feeders, CCTV, etc. to soothe the loneliness of their companion animals and secure their safety. Accordingly, the pet tech market is growing significantly every year.
Banzle is a new pet tech product that allows you to check the current status of your companion animal using the camera on your smartphone, make a video call with your pet, and select a video to play on your pet at home from a remote location.
CEO Park Byeong-il said, “Currently, YouTube’s videos specialized for dogs and cats are provided through the Banzzle app, and we will invest more in developing videos for companion animals in the future.”
Banzzle can be downloaded for free from Google Play Store (Android) and App Store (IOS).
Practical Overview
Practical is a smartphone app developer established in 2018.
WebRTC를 이용한 화상/데이터 통신은 기본적으로 시그널 서버가 필요하다. 일반적으로 Websocket을 많이 사용하는데 서버는 클라이언트에서 전송되는 SDP, Candidate를 릴레이 하여 클라이언트가 연결할 상대방의 IP와 Port 정보를 주고 받은 다음 받은 정보를 이용하여 P2p 접속을 시도한다.
MQTT
MQTT는 발행/구독 기반으로 일대일, 일대다 데이터 통신에 적합하고 구독 채널을 트리구조로 구성 할 수 있기 때문에 Websocket에서 채팅방-서브 채팅방을 구현하는 기능을 아주 간단하게 구현 할 수 있다.
아이디어 – Mosquitto
WebRTC 화상통신앱을 만들며 처음부터 이 생각을 했다. WebSocket으로 채팅방을 만들지 않고 MQTT를 이용하면 안될까? Mosquitto 서버라면 보안성 문제도 쉽게 해결 할 수 있고 성능도 우수한 시그널 서버로 활용할 수 있지 않을까? 그래서 한번 해봤다.
Sample Code – Flutter
아래 링크의 소스 코드는 현재 만들고 있는 CCTV관련앱에서 기본적인 기능만 추출해서 Sample Project를 만들었다. Flutter로 만들어진 오픈소스이며 오픈된 Mosquitto 서버에 접속하여 동일한 토픽을 발행/구독하여 시그널을 주고 받은후 P2p를 연결하여 화상통신을 실행한다.